home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5m2.s < prev    next >
Text File  |  1994-07-08  |  5KB  |  154 lines

  1.  
  2. ; Lezione5m2.s    "CHIUSURA" DELLA FINESTRA VIDEO CON I DIWSTART/STOP ($8e/$90)
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28. ;
  29.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  30.     move.w    d0,$dff088        ; Facciamo partire la COP
  31.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  32.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  33.  
  34. mouse:
  35.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  36.     bne.s    mouse        ; Se non ancora, non andare avanti
  37.  
  38.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  39.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  40.  
  41.     bsr.w    DIWORIZZONTALE    ; mostra la funzione dei DIWSTART e DIWSTOP
  42.  
  43. Aspetta:
  44.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  45.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  46.  
  47.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  48.     bne.s    mouse        ; se no, torna a mouse:
  49.  
  50.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  51.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  52.  
  53.     move.l    4.w,a6
  54.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  55.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  56.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  57.     rts            ; USCITA DAL PROGRAMMA
  58.  
  59. ;    Dati
  60.  
  61. GfxName:
  62.     dc.b    "graphics.library",0,0    
  63.  
  64. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  65.     dc.l    0    ; della graphics.library
  66.  
  67. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  68.     dc.l    0
  69.  
  70. ; Questa routine porta a $ff DIWXSTART incrementandolo di uno ogni volta e
  71. ; a $00 DIWXSTOP decrementandolo di uno ogni volta. Quando entrambi i valori
  72. ; sono raggiunti la routine esce senza modificare niente
  73.  
  74. DIWORIZZONTALE:
  75.     CMPI.B    #$FF,DIWXSTART    ; Siamo arrivati al massimo DIWSTART?
  76.     BEQ.S    FINITO        ; se si, non possiamo procedere oltre
  77.     ADDQ.B    #1,DIWXSTART    ; se no, allora aggiungiamo 1
  78. FINITO:
  79.     TST.B    DIWXSTOP    ; Siamo arrivati al minimo DIWSTOP? ($00)
  80.     BEQ.S    FINITO2        ; se si non possiamo calare oltre
  81.     SUBQ.B    #1,DIWXSTOP    ; se no, allora sottraiamo1
  82. FINITO2:
  83.     RTS            ; Uscita dalla routine
  84.  
  85.  
  86.     SECTION    GRAPHIC,DATA_C
  87.  
  88. COPPERLIST:
  89.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  90.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  91.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  92.     dc.w    $13e,$0000
  93.  
  94.     dc.w    $8E        ; DIWSTART - Inizio finestra video
  95.     dc.b    $2c        ; DIWSTRT $YY
  96. DIWXSTART:
  97.     dc.b    $81        ; DIWSTRT $XX (lo incrementiamo fino a $ff)
  98.  
  99.     dc.w    $90        ; DIWSTOP - Fine finestra video
  100.     dc.b    $2c        ; DiwStop YY
  101. DIWXSTOP:
  102.     dc.b    $c1        ; DiwStop XX (lo caliamo fino a $00)
  103.     dc.w    $92,$0038    ; DdfStart
  104.     dc.w    $94,$00d0    ; DdfStop
  105.     dc.w    $102,0        ; BplCon1
  106.     dc.w    $104,0        ; BplCon2
  107.     dc.w    $108,0        ; Bpl1Mod
  108.     dc.w    $10a,0        ; Bpl2Mod
  109.  
  110.             ; 5432109876543210
  111.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  112.                     ; 3 bitplanes lowres, non lace
  113. BPLPOINTERS:
  114.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  115.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  116.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  117.  
  118.     dc.w    $0180,$000    ; color0
  119.     dc.w    $0182,$475    ; color1
  120.     dc.w    $0184,$fff    ; color2
  121.     dc.w    $0186,$ccc    ; color3
  122.     dc.w    $0188,$999    ; color4
  123.     dc.w    $018a,$232    ; color5
  124.     dc.w    $018c,$777    ; color6
  125.     dc.w    $018e,$444    ; color7
  126.  
  127.     dc.w    $ca07,$fffe
  128.     dc.w    $180,$456    ; nota: il colore di fondo non viene coinvolto
  129.                 ; dal diwstart-diwstop
  130.  
  131.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  132.  
  133. ;    figura
  134.  
  135. PIC:
  136.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  137.                     ; convertita col KEFCON, fatta di
  138.                     ; 3 bitplanes consecutivi
  139.  
  140.     end
  141.  
  142. Questo listato mostra come si possa diminuire la grandezza della finestra
  143. video in senso orizzontale: se per esempio visualizzassimo solo delle figure
  144. al centro dello schermo, potremmo "risparmiare" lavoro al copper, dunque
  145. guadagnare velocita' per altri lavori, semplicemente restringendo la finestra
  146. facendoci entrare la figura ed escludendo i "vuoti" laterali, oppure si possono
  147. fare effetti di "chiusura" dello schermo. Avrete notato pero' che non si puo'
  148. chiudere del tutto "lo schermo", ma rimane una linea, e che questa linea non
  149. e' al centro dello schermo, ma spostata verso destra. Infatti il limite che
  150. si puo; raggiungere nel "RESTRINGIMENTO" del visualizzabile e' proprio a quella
  151. linea, infatti e' la posizione DIWSTART XX = $FF e DIWSTOP XX = $00.
  152. Avrete notato anche che questi registri influiscono sui bitplanes, e non sul
  153. colore di sfondo!
  154.